package com.sheepone.util.algorithm.math;

import java.awt.geom.Point2D;
import java.util.Random;

/**
 * @author Miss.杨
 * @description
 * @since 2024/3/14 - 13:55
 */
public class RandomUtil {

    private static final Random UTIL = new Random();


    public static int randomInt(int min, int max) {
        return UTIL.nextInt(min, max + 1);
    }

    /**
     * 随机获取 [0,size-1] 区间内的数 通常用于数组下标
     *
     * @param size
     * @return
     */
    public static int randomIndex(int size) {
        return UTIL.nextInt(0, size);
    }

    /**
     * 生成一个在指定圆上均匀分布的随机点。
     *
     * @param centerX 圆心的 x 坐标
     * @param centerY 圆心的 y 坐标
     * @param radius  圆的半径
     * @return 包含随机点坐标的 Point2D 类实例
     */
    public static Point2D randomPointAtCircle(double centerX, double centerY, double radius) {
        // 生成 [0, 2π] 区间内的随机弧度值
        double angle = Math.PI * 2 * UTIL.nextDouble();

        // 根据极坐标公式计算随机点的直角坐标
        double x = centerX + radius * Math.cos(angle);
        double y = centerY + radius * Math.sin(angle);

        return new Point2D.Double(x, y);
    }

    public static Point2D randomPointAtCircle(double radius) {
        return randomPointAtCircle(0, 0, radius);
    }

    public static double randomDouble(double min, double max) {
        return randomDouble(min, max, false);
    }

    public static double randomDouble(double min, double max, boolean includeMax) {
        // [min, max]
        return includeMax ? min + (max - min) * UTIL.nextDouble() : UTIL.nextDouble(min, max);
    }
    /**
     * 如果值不在指定范围内，则返回目标范围内的随机值
     * @param min 最小值
     * @param max 最大值
     * @param value 值
     * @return 目标范围内的值
     */
    public static double randomIfOutRange(double min,double max,double value) {
        if(value < min || value > max){
            return RandomUtil.randomDouble(min,max,true);
        }
        return value;
    }

}
